#ifndef LINK_H_INCLUDED
#define LINK_H_INCLUDED

typedef struct List_t List;

/*  Creates new Double list                                                                                 */
List* ListNew(void);
/*  Deletes Double list                                                                                     */
void ListDel(List* _list);
/*  Push void* data to head of list                                                                         */
int ListPushH(List* _list, void* _data);
/*  Push void* data to tail of list                                                                         */
int ListPushT(List* _list, void* _data);
/*  Push multipile "vector" to head. Gets size of element and size of vector, and pointer of vector         */
int ListPushHM(List* _list, size_t _elementSize, size_t _vectNumOfElem, void* _dataVector);
/*  Push multipile "vector" to tail. Gets size of element and size of vector, and pointer of vector         */
int ListPushTM(List* _list, size_t _elementSize, size_t _vectNumOfElem, void* _dataVector);
/*  Return the data of head of list                                                                         */
void* ListHead(List* _list);
/*  Return the data of tail of list                                                                         */
void* ListTail(List* _list);
/*  Pop head - remove it                                                                                    */
void ListPopH(List* _list);
/*  Pop tail - remove it                                                                                    */
void ListPopT(List* _list);
/*  Pop _v elements from head - remove them                                                                 */
void ListPopHM(List* _list, size_t _vectNumOfElem);
/*  Pop _v elements from tail - remove them                                                                 */
void ListPopTM(List* _list, size_t _vectNumOfElem);
/*  Find in list the matching data accord to param , according to IsMatch function with the below prototype */
/*  to compare between param and data. Return the relavant data.                                            */
void* ListFindIf(List* _list, int (*_isMatch)(void* _data, void* _param), void* _param);
/*  Counts the arguments in list. Works with complexiplity of O(n)                                          */
size_t ListCount(List* _list);
/*  Bool function for checking if list is empty                                                             */
int ListIsEmpty(List* _list);



#endif /* LINK_H_INCLUDED   */
